/**
 * 数据类型: string、number、boolean、null、undefined、object、bigint、symbol
 * let: 定义变量
 * const: 定义常量
 * var: 老版本的
 */

let a = 123;
console.log(a);
a = "abc";

const b = 123;
console.log(b);
// b = "abc"; 报错

console.log(typeof a); // string  "abc"、'abc'、`abc`
console.log(typeof b); // number
console.log(typeof true); // boolean
console.log(typeof null); // null （不是空指针，而是空值）
console.log(typeof c); // undefined（未定义的）
console.log(typeof Math); // object

console.log("显式类型转换");
// -> string
console.log(String(null)); // "null"
console.log((10.01).toString()); // "10.01"
// -> number
console.log(Number("10.01px")); // NaN （Not a Number）具有粘性， NaN + 1 = NaN
console.log(Number("  10.01  ")); // 10.01
console.log(Number("    ")); // 0
console.log(Number(undefined)); // NaN
console.log(Number(null)); // 0
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(parseInt("10.01px")); // 10
console.log(parseFloat("10.21px").toFixed(1)); // 10.2
// -> boolean
console.log(Boolean(0)); // fasle
console.log(Boolean("")); // false
console.log(Boolean(" ")); // true

console.log("隐式类型转换");
// -> string, + 字符串连接符
console.log(`px` + 5 + 4); // "px54"
console.log(5 + 4 + "px"); // "9px"
// -> number, 算术运算符 +-*/%^, 比较运算符 > < == >= <=, 严格等===(首先判断类型是否一致)
console.log("4" - 2); // 2,  "4" -> 4
console.log("4px" - 2); // NaN, "4px" -> NaN
console.log(true + 13); // 14, true -> 1
console.log(false == ""); // true, fasel -> 0, "" -> 0
console.log(false === ""); // false
// -> boolean, 逻辑运算符 && || !, if
// 或运算 寻找第一个真值, 如果前面的都是fase，那结果就是最后一个值
console.log(0 || null || "abc"); // "abc" , 0 -> false, null -> false
console.log(0 || "abc" || 1); // "abc", 0 -> false, "abc" -> true
// 与运算 寻找第一个假值, 如果前面的都是true，那结果就是最后一个值
console.log(123 && null && "abc"); // null , 123 -> true, null -> false
console.log(123 && "abc" && "efg"); // "efg", 123 -> true, "abc" -> true